﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//0开头的数字，会被当做8进制
//16进制表⽰的时候前⾯加0x
    //int main() 
//{
//    printf("%d\n", 153);
//    printf("%d\n", 0153);8进制
//    printf("%d\n", 0x153);16进制
//	return 0;
//}

//原码、反码、补码
//正整数的原、反、补码都相同。
//负整数的三种表⽰⽅法各不相同。
//原码：直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
//反码：将原码的符号位不变，其他位依次按位取反就可以得到反码。
//补码：反码 + 1就得到补码。

//int main()
//{
//    int a = 10;
//    //0 0000000000000000000000000001010 源码
//    //0 0000000000000000000000000001010 源码
//    //0 0000000000000000000000000001010 源码
//    return 0;
//}

//左移操作符
//移位规则：左边抛弃、右边补0
//int main()
//{
//    int a = 6;
//    //int b = (a << 1);
//    int b = (a << 3);
//    printf("a = %d\n", a);
//    printf("b = %d\n", b);
//    return 0;
//}

//右移操作符
//逻辑右移：左边⽤0填充，右边丢弃
//算术右移：左边⽤原该值的符号位填充，右边丢弃
//int main()
//{
//    int n = -10;//算术右移
//    int m = (n >> 1);
//    printf("%d", m); 
//    return 0;
//}


//位操作符
// & 按位与
// | 按位或
 //^ 按位异或
 //~ 按位取反
//int main()//按位与 ，对于二进制位进行运算，只要又有0则为0，同时为一则唯一
//{
//    int a = 3;
//    int b = 15;
//    int c = a & b;
//    printf("%d", c);
//    return 0;
//}

//int main()//| =按位或，时对应的二进制进行运算，只要有1就是1，两个同时为0就是0
//{
//    int a = 3;
//    //00000000000000000000000000000011 --a的补码
//    int b = -5;
//    //10000000000000000000000000000101  --b的源码
//    //11111111111111111111111111111010 --b的反码
//    //11111111111111111111111111111011 --b的补码
//    //11111111111111111111111111111011
//    //10000000000000000000000000000101
//    int c = a | b;
//    printf("%d", c);
//    return 0;
//}

/*int main()*/// ^ 异或对应的二进制位相同为0，相异为1
//{
//    int a = 6;
//    //00000000000000000000000000000110 --a的补码
//    int b = -5;
//    //10000000000000000000000000000101  --b的源码
//    //11111111111111111111111111111011 --b的补码
//    //11111111111111111111111111111101
//    //10000000000000000000000000000011
//
//    int c = a ^ b;
//    printf("%d", c);
//    return 0;
//}

//int main()//~ 按位取反（原来是0变成1，原来是1变成0）
//{
//    int a = 0;
//    //000000000000000000000000000000  a的补码
//    int b = ~a;
//    printf("%d", b);
//    return 0;
//}
//#include <stdio.h>
//int main() {
//    int a = 10;
//    int b = 20;
//    a = a ^ b;
//    b = a ^ b;
//    a = a ^ b;
//    printf("a = %d b = %d\n", a, b);
//    return 0;
//}
// 
// 
//int bit(int n)
//{
//    int count = 0;
//    while (n)
//    {
//        if ((n % 2) == 1)
//            count++;
//        n /= 2;
//    }
//    return count;
//}
//
//int main()
//{
//    int n = 0;
//    scanf("%d", &n);
//    int r = bit(n);
//    printf("%d", r);
//    return 0;
// }
// 
//求⼀个整数存储在内存中的⼆进制中1的个数
//int bit(int n)
//{
//    int i = 0;
//    int count = 0;
//    for (i = 0; i < 32; i++) 
//    {
//        int count = 0;
//        if ((n >> 1 & 1) == 1)
//            count++;
//    }
//    return count;
//}
//int main()
//    {
//        int n = 0;
//        scanf("%d", &n);
//        int r = bit(n);
//        printf("%d", r);
//        return 0;
//    }

//int bit(int n)
//{
//    int count =0;
//    while (n)
//    {
//        n = n &(n - 1);
//        count++;
//    }
//    return count;
//
//}
//int main()
//{
//    int n = 0;
//    scanf("%d",&n);
//    int r = bit(n);
//    printf("%d", r);
//    return 0;
//}


//int arr[5] = {0};
//[]下表引用操作符
//arr，5是[]的操作数


//数据类型：
//内置型
//自定义型：数组，枚举，结构体联合体


//结构的声明
// 结构体是有一些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量，
//结构体需要一个关键字struct


//struct stu
//{
//    //1个或者多个成员 - 这些成员都是用来、
//    char name[20];
//    int age;
//    char id[11];
//    float score;
//};
//
//struct s5;//全局变量
//
//int main()
//{
//    int num = 0;
//    struct stu s1 = {"张三", 20, "20231203089", 85.5f};
//    struct stu s2 = {.age = 18, .name = "wori", .score = 95.5f, .id = "20231203090"};
//    struct stu s3;
//    struct stu s4;//局部变量
//
//    return 0;
//}


//struct peo {
//    char name[20];
//    int age;
//    char tele[12];
//};
//
//struct Ebook {
//
//    struct peo  data[100];//可以存放一百个人的信息
//    int count;
//};
//int main() {
//    struct peo p1 = {"zhangshan", 18, "2023520"};
//    struct Ebook eb = {{{"nihao", 18, "12345"}, {"wang", 18, "12223"}}, 0};
//    //printf("%s\n", p1.name);
//    //printf("%d\n", p1.age);
//    //printf("%s\n", p1.tele);
//    printf("%d\n", eb.data[1].name);
//    return 0;
//}

//操作符优先级
//优先级
//结合性
//int main()
//{
//    //int n = 5;
//    //int m = 5;
//    //int c  = 
//    return 0;
//}



//表达式求值
// 整体提升
//C语⾔中整型算术运算总是⾄少以缺省（默认）整型类型的精度来进⾏的。
int main()
{
    //int a = 8l;//加一个l变成long类型
    char a = 20;//char 类型的取值范围是：-128 ~127
    //00000000000000000000000000010100
    //char 类型只有一个字节所以此时的
    //应该是00010100
    char b = 120;
    //00000000000000000000000001111000
    //01111000 b
    //此时要进行运算的话需要进行整体提升
    //此时
    //1. 有符号整数提升是按照变量的数据类型的符号位来提升的 
    //2. ⽆符号整数提升，⾼位补0
    // 00000000000000000000000000010100
    // 00000000000000000000000001111000
    //在进行相加

    char c = a + b;
    printf("%d", c);
    //%d -打印10进制的形式，打印一个有符号的整形（int）
    return 0;
}